#pragma once

// 一元函数的参数类型和返回值类型
template <class _Arg, class _Result>
struct un_binary_function {
  typedef _Arg argument_type;
  typedef _Result result_type;
};

template<typename ArgType1, typename ArgsType2, typename resultType>
struct binary_function
{
    using Arg1 = ArgType1;
    using Arg2 = ArgsType2;
    using ResultType = resultType;
};

template<typename PairType>
struct _Select1st : public un_binary_function<PairType, typename PairType::first_type>
{
    const typename PairType::first_type& operator()(const PairType& _pair) const
    {
        return _pair.first;
    }
};

template<typename PairType>
struct _Select2nd : public un_binary_function<PairType, typename PairType::second_type>
{
    const typename PairType::second_type& operator()(const PairType& _pair) const
    {
        return _pair.second;
    }
};